home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / COMMS / ATTACHER.ZIP / !Attacher / C / Vers101 < prev    next >
Text File  |  1997-11-13  |  52KB  |  1,716 lines

  1. /* Title:   !Attacher      */
  2.  
  3. #include "wimp.h"
  4. #include "wimpt.h"
  5. #include "win.h"
  6. #include "event.h"
  7. #include "baricon.h"
  8. #include "res.h"
  9. #include "resspr.h"
  10. #include "menu.h"
  11. #include "template.h"
  12. #include "dbox.h"
  13. #include "dboxquery.h"
  14. #include "werr.h"
  15. #include "visdelay.h"
  16. #include "xferrecv.h"
  17. #include "SWItable.h"
  18. #include "msgs.h"
  19. #include "help.h"
  20.  
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <stdio.h>
  24. #include <kernel.h>
  25.  
  26. /******************************** GLOBAL DATA *****************************/
  27.  
  28. static BOOL my_win_open = FALSE;
  29. static BOOL unsafe_data = FALSE;
  30. static BOOL ok_not_grey = FALSE;
  31. static BOOL already_been_open = FALSE;
  32. static BOOL split_file = FALSE;
  33. static BOOL keep_ext = FALSE;
  34. static BOOL uu_add_ext = FALSE;
  35. static BOOL base64_add_ext = FALSE;
  36. static BOOL splitting_file = FALSE;
  37. static BOOL already_found_a_file = FALSE;
  38. static BOOL processing_uucode = FALSE;
  39. static BOOL processing_base64 = FALSE;
  40. static BOOL found_end = FALSE;
  41. static BOOL prequit = FALSE;
  42.  
  43. static _kernel_oserror *pos_error;
  44. static int part_number, split_length, old_split_length, drag_filetype;
  45. static int file_length, chars_read, max_chars, no_parts, total_read;
  46. static int Slen, Mchar, help_icon;
  47. static menu my_menu;
  48. static dbox info_box_handle, split_box_handle, links_box_handle;
  49. static wimp_w action_win_handle, split_win_handle;
  50. static wimp_i my_ibar_icon;
  51. static wimp_caretstr caret_pos;
  52. static wimp_icon result;
  53. static wimp_wstate state;
  54. static char file_sprite[10], file_uua[255], file_uub[255];
  55. static char my_line[255], my_line2[255], my_line3[255], base64_default[100];
  56. static char split_prefix[255], split_suffix[50], default_file[100];
  57. static char *st_result, version_num[10], source_name[55];
  58. static char scrap_dir[256], file_to_code[214];
  59. static FILE *input_file, *output_file;
  60. static fpos_t *file_index, file_position;
  61. static wimp_msgstr open, msg;
  62. static _kernel_swi_regs r;
  63.  
  64. enum TOKENTYPE { NONE, BLANKS, PUNCT, TAG, NAME, CONTENT };
  65. struct TOKEN {
  66.                 char *text;
  67.                 int  length;
  68.                 int  index;
  69.                 enum TOKENTYPE type;
  70.              };
  71.  
  72. #define icon_help 0
  73. #define icon_decode 1
  74. #define icon_uuencode 2
  75. #define icon_64encode 3
  76. #define icon_info 4
  77. #define icon_savefile 5
  78. #define icon_savebutton 6
  79. #define icon_filename 7
  80. #define icon_cancel 8
  81. #define icon_discard 10
  82.  
  83. /********************** GENERAL EVENT HANDLERS ****************************/
  84.  
  85. static void text_in_icon(wimp_w this_window,wimp_i this_icon,char *this_text)
  86. {
  87.   wimp_get_icon_info(this_window,this_icon,&result);
  88.   strcpy(result.data.indirecttext.buffer,this_text);
  89.   wimp_set_icon_state(this_window,this_icon,0,0);
  90. }
  91.  
  92. static void reset_main_window()
  93. {
  94.   text_in_icon(action_win_handle,icon_filename,"");
  95.   wimp_set_icon_state(action_win_handle,icon_filename,0x400000,0x400000);
  96.   wimp_set_icon_state(action_win_handle,icon_savebutton,0x400000,0x400000);
  97.   text_in_icon(action_win_handle,icon_info,"Drag a file to one of the code or decode icons");
  98.   text_in_icon(action_win_handle,icon_help, "");
  99.   wimp_get_icon_info(action_win_handle,icon_savefile,&result);
  100.   strcpy(result.data.indirecttext.validstring,"s!attacher");  
  101.   wimp_set_icon_state(action_win_handle,icon_savefile,0x1700011b,0xffffffff);
  102.   wimp_set_icon_state(action_win_handle,icon_decode,0x2700013f,0xffffffff);
  103.   wimp_set_icon_state(action_win_handle,icon_uuencode,0x2700013f,0xffffffff);
  104.   wimp_set_icon_state(action_win_handle,icon_64encode,0x2700013f,0xffffffff);
  105.   ok_not_grey = FALSE;
  106. }
  107.  
  108. static void open_main_window()
  109. {
  110.   if(!my_win_open)
  111.     {
  112.       reset_main_window();
  113.       wimp_get_wind_state(action_win_handle,&state);
  114.       state.o.behind=-1;
  115.       if (!already_been_open)
  116.       {
  117.         state.o.box.x0 = 158;
  118.         state.o.box.y0 = 288;
  119.         state.o.box.x1 = 1000;
  120.         state.o.box.y1 = 788;
  121.       }  
  122.       wimp_open_wind(&state.o);
  123.       my_win_open = TRUE;
  124.       already_been_open = TRUE;
  125.     }
  126. }
  127.  
  128. static void my_iconclick(wimp_i icon)
  129. {
  130.   icon=icon;
  131.   
  132.   if(my_win_open)
  133.   {
  134.     wimp_get_wind_state(action_win_handle,&state);
  135.     state.o.behind=-1;
  136.     wimp_open_wind(&state.o);    
  137.   }
  138.   else open_main_window();
  139. }
  140.  
  141. static void return_to_wimp()
  142. {
  143.   wimp_eventstr dummy_event;
  144.   
  145.   visdelay_end();
  146.   wimp_poll(0,&dummy_event);
  147.   visdelay_begin();
  148. }
  149.  
  150. static void exit_function()
  151. {
  152.   if (prequit)
  153.   {
  154.     r.r[0] = 27;
  155.     r.r[1] = (int) "<Wimp$ScrapDir>.Attacher";
  156.     r.r[3] = 1;
  157.     _kernel_swi(OS_FSControl, &r, &r);
  158.   }
  159. }
  160.  
  161. static void process_help_message(wimp_eventstr *e)
  162. {
  163.   if(e->data.msg.data.helprequest.m.i == my_ibar_icon && e->data.msg.data.helprequest.m.w == -2) 
  164.   {
  165.     help_reply(msgs_lookup("Ibar:This is UUcoder"));
  166.     return;
  167.   }
  168.   if(e->data.msg.data.helprequest.m.w == action_win_handle)
  169.   {
  170.     switch(e->data.msg.data.helprequest.m.i)
  171.     {
  172.       case 1:
  173.         help_reply(msgs_lookup("Action1"));
  174.         break;
  175.       case 2:
  176.         help_reply(msgs_lookup("Action2"));
  177.         break;
  178.       case 3:
  179.         help_reply(msgs_lookup("Action3"));
  180.         break;
  181.       case 6:
  182.         help_reply(msgs_lookup("Action6"));
  183.         break;
  184.       case 7:
  185.         help_reply(msgs_lookup("Action7"));
  186.         break;
  187.       case 8:
  188.         help_reply(msgs_lookup("Action8"));
  189.         break;
  190.       case 9:
  191.         help_reply(msgs_lookup("Action9"));
  192.         break;
  193.       case 5:
  194.         if (ok_not_grey) help_reply(msgs_lookup("Action5"));
  195.         else help_reply(msgs_lookup("Action"));
  196.         break;
  197.       default:
  198.         help_reply(msgs_lookup("Action"));
  199.     }
  200.   }      
  201. }
  202.   
  203. static void split_fname()
  204. {
  205.   part_number = part_number + 1;
  206.   sprintf(my_line, "%s%02d%s", split_prefix, part_number, split_suffix);
  207.   text_in_icon(action_win_handle ,icon_filename, my_line);
  208.   if(part_number != 1)
  209.   {
  210.     caret_pos.w = action_win_handle;
  211.     caret_pos.i = icon_filename;
  212.     caret_pos.index = strlen (my_line);
  213.     caret_pos.height = -1;
  214.     wimp_set_caret_pos(&caret_pos);
  215.   }
  216. }
  217.  
  218. static BOOL save_split_file(char *filename)
  219. {
  220.   div_t div_result;
  221.   
  222.   output_file = fopen(filename, "wb");
  223.   if (output_file == NULL)
  224.   {
  225.     werr(FALSE,msgs_lookup("error7:Cannot save file here"));
  226.     text_in_icon(action_win_handle,icon_info,"Section coded and ready to save");
  227.     return FALSE;
  228.   }
  229.   input_file = fopen(file_uub,"rb");
  230.   if(part_number != 1) 
  231.   {
  232.     fsetpos(input_file, file_index);
  233.     fprintf(output_file,"%s part %d/%d  [uuencoded by RISC OS Attacher v%s]\n\n-------- CUT -------- CUT -------- CUT -------- CUT ---------\n", source_name,part_number,no_parts,version_num);
  234.   }
  235.   else
  236.   {
  237.     max_chars = (split_length * 1000) - 500;
  238.     div_result = div(max_chars, 62);
  239.     max_chars = div_result.quot * 62;
  240.     total_read = 0;
  241.     div_result = div(file_length, max_chars);
  242.     if (div_result.rem == 0) no_parts = div_result.quot;
  243.     else no_parts = div_result.quot + 1;
  244.   }  
  245.   chars_read = 0;
  246.   if(((file_length-total_read-max_chars) > 0) && ((file_length-total_read-max_chars) < 500)) max_chars = max_chars - 500;
  247.   while((chars_read < max_chars) && splitting_file)
  248.   {
  249.     st_result = fgets(my_line, 255, input_file);
  250.     if (st_result != NULL)
  251.     {
  252.       fputs(my_line, output_file);
  253.       chars_read = chars_read + strlen(my_line);
  254.     }
  255.     else splitting_file = FALSE;
  256.   } 
  257.   total_read = total_read + chars_read; 
  258.   if (splitting_file) 
  259.   {
  260.     fgetpos(input_file, file_index);
  261.     fprintf(output_file,"-------- CUT -------- CUT -------- CUT -------- CUT ---------\n\n%s part %d/%d  [uuencoded by RISC OS Attacher v%s]\n", source_name,part_number,no_parts,version_num);
  262.   }
  263.   fclose(input_file);
  264.   fclose(output_file);
  265.   r.r[0] = 18;
  266.   r.r[1] = (int) filename;
  267.   r.r[2] = 0xfff;
  268.   _kernel_swi(OS_File, &r, &r);
  269.   if (splitting_file)
  270.   {
  271.     split_fname();
  272.     text_in_icon(action_win_handle,icon_info,"Next section of uuencoded file ready to save");
  273.   }
  274.   else 
  275.   {
  276.     remove (file_uub);
  277.     caret_pos.w = action_win_handle;
  278.     caret_pos.i = -1;
  279.     wimp_set_caret_pos(&caret_pos);
  280.     wimp_get_wind_state(action_win_handle, &state);
  281.     wimp_close_wind(action_win_handle);
  282.     reset_main_window();
  283.     wimp_open_wind(&state.o);
  284.     unsafe_data = FALSE;
  285.   }
  286.   return TRUE;
  287. }  
  288.  
  289. static void handle_link()
  290. {
  291.   dbox_field field_number;
  292.   wimp_eventstr e;
  293.   
  294.   strcpy(msg.data.chars, "");
  295.   dbox_show(links_box_handle);
  296.   field_number = dbox_fillin(links_box_handle);
  297.   switch (field_number)
  298.   {
  299.     case 0:
  300.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/software/attach.spk");
  301.       break;
  302.         
  303.     case 3:
  304.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/john/atin.html");
  305.       break;
  306.         
  307.     case 4:
  308.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/john/athis.html");
  309.       break;
  310.         
  311.     case 5:
  312.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/john/soft.html");
  313.       break;
  314.           
  315.     case 6:
  316.       strcpy(msg.data.chars, "mailto:john@bramber.demon.co.uk");
  317.       break;
  318.   }
  319.   dbox_hide(links_box_handle);
  320.   if (strlen(msg.data.chars) == 0) return;
  321.   msg.hdr.size = 256;
  322.   msg.hdr.your_ref = 0;
  323.   msg.hdr.action = 0x4af80; 
  324.   wimp_sendmessage(18, &msg, 0);
  325.   wimp_poll( 0x1973, &e);
  326.   if((e.e == wimp_ESENDWANTACK) && (e.data.msg.hdr.action ==  wimp_MDATAOPEN)) wimp_poll( 0x1973, &e);
  327.   if (field_number == 6) 
  328.   {
  329.     os_read_var_val("Alias$URLOpen_mailto", my_line, 255);
  330.     if (strlen(my_line) != 0)
  331.     {
  332.       if (strstr(my_line, "Messenger") != NULL)
  333.       {
  334.         strcpy(my_line, "URLOpen_mailto ");
  335.         strcat(my_line, msg.data.chars);
  336.         wimp_starttask(my_line);
  337.       }
  338.     }
  339.   }
  340.   else 
  341.   {
  342.     os_read_var_val("Alias$URLOpen_HTTP", my_line, 255);
  343.     if (strlen(my_line) != 0)
  344.     {
  345.       if (strstr(my_line, "ArcWeb") != NULL)
  346.       {
  347.         strcpy(my_line, "URLOpen_HTTP ");
  348.         strcat(my_line, msg.data.chars);
  349.         wimp_starttask(my_line);
  350.       }
  351.     }
  352.   }  
  353. }
  354.  
  355. static void convert_sprite_details()
  356. {
  357.   sprintf(file_sprite, "file_%03x\0", drag_filetype);
  358.   if(wimp_spriteop(40,file_sprite) != 0) strcpy(file_sprite,"file_xxx");
  359. }
  360.  
  361. static void start_the_drag()
  362. {
  363.   int wind_limit, wind_factor;
  364.   wimp_dragstr drag;
  365.   
  366.   drag.window = action_win_handle;
  367.   drag.type = 5;
  368.   drag.parent.x0 = -20;
  369.   drag.parent.y0 = -20;
  370.   r.r[0] = -1;
  371.   r.r[1] = 11;
  372.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  373.   wind_limit = r.r[2];
  374.   r.r[0] = -1;
  375.   r.r[1] = 4;
  376.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  377.   wind_factor = r.r[2];
  378.   drag.parent.x1 = (wind_limit <<wind_factor) + 20;
  379.   r.r[0] = -1;
  380.   r.r[1] = 12;
  381.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  382.   wind_limit = r.r[2];
  383.   r.r[0] = -1;
  384.   r.r[1] = 5;
  385.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  386.   wind_factor = r.r[2];
  387.   drag.parent.y1 = (wind_limit << wind_factor) + 20;  
  388.   wimp_get_icon_info(action_win_handle, icon_savefile, &result);
  389.   wimp_get_wind_state(action_win_handle, &state);
  390.   drag.box.x0 = result.box.x0 + state.o.box.x0 + 40;
  391.   drag.box.x1 = result.box.x1 + state.o.box.x0 - 40;
  392.   drag.box.y0 = result.box.y0 + state.o.box.y1 + 38;
  393.   drag.box.y1 = result.box.y1 + state.o.box.y1 - 40;
  394.   r.r[0] = 161;
  395.   r.r[1] =28;
  396.   _kernel_swi(OS_Byte, &r, &r);
  397.   if((r.r[2] & 2) == 2) 
  398.   {
  399.     convert_sprite_details();
  400.     r.r[0] = 197;
  401.     r.r[1] = 1;
  402.     r.r[2] = (int) &file_sprite;
  403.     r.r[3] = (int) &drag.box;
  404.     r.r[4] = (int) &drag.parent;
  405.     _kernel_swi(DragASprite_Start, &r, &r);
  406.   }
  407.   else wimp_drag_box(&drag);
  408. }
  409.  
  410. static void reply_with_scrap(wimp_eventstr *e)
  411. {
  412.   e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  413.   e->data.msg.hdr.action = wimp_MDATASAVEOK;
  414.   e->data.msg.hdr.size = 256;
  415.   e->data.msg.data.datasaveok.estsize = -1;
  416.   sprintf(e->data.msg.data.datasaveok.name,"<Wimp$ScrapDir>.Attacher.!!Scrap!!");
  417.   wimpt_noerr(wimp_sendmessage(wimp_ESENDWANTACK,&e->data.msg,e->data.msg.hdr.task));
  418. }
  419.  
  420. static void load_choices_vals()
  421. {
  422.   dbox_getfield(split_box_handle, 8, split_prefix, 255);
  423.   dbox_getfield(split_box_handle, 10, split_suffix, 50);
  424.   dbox_getfield(split_box_handle, 14, default_file,255);
  425.   dbox_getfield(split_box_handle, 26, base64_default,255);
  426.   split_length = dbox_getnumeric(split_box_handle, 4);
  427.   if (split_length < 2) split_length = 2;
  428.   dbox_setnumeric(split_box_handle, 4, split_length);
  429.   wimp_get_icon_info(split_win_handle, 1, &result);
  430.   if((result.flags & wimp_ISELECTED) == 0) split_file = FALSE;
  431.   else split_file =TRUE;
  432.   wimp_get_icon_info(split_win_handle, 24, &result);
  433.   if((result.flags & wimp_ISELECTED) == 0) keep_ext = FALSE;
  434.   else keep_ext = TRUE;
  435.   wimp_get_icon_info(split_win_handle, 28, &result);
  436.   if((result.flags & wimp_ISELECTED) == 0) uu_add_ext = FALSE;
  437.   else uu_add_ext = TRUE;
  438.   wimp_get_icon_info(split_win_handle, 29, &result);
  439.   if((result.flags & wimp_ISELECTED) == 0) base64_add_ext = FALSE;
  440.   else base64_add_ext = TRUE;
  441. }
  442.  
  443. static void handle_uu_choices()
  444. {
  445.   BOOL keep_loop = TRUE;
  446.   wimp_iconflags old_flags, old_flags1, old_flags2, old_flags3;
  447.   BOOL old_uu_add_ext, old_base64_add_ext, old_keep_ext, old_split_file;
  448.      
  449.   dbox_show(split_box_handle);
  450.   old_split_file = split_file;
  451.   old_keep_ext = keep_ext;
  452.   old_uu_add_ext = uu_add_ext;
  453.   old_base64_add_ext = base64_add_ext;
  454.   wimp_get_icon_info(split_win_handle, 1, &result);
  455.   old_flags = result.flags;
  456.   wimp_get_icon_info(split_win_handle, 24, &result);
  457.   old_flags1 = result.flags;
  458.   wimp_get_icon_info(split_win_handle, 28, &result);
  459.   old_flags2 = result.flags;
  460.   wimp_get_icon_info(split_win_handle, 29, &result);
  461.   old_flags3 = result.flags;
  462.   old_split_length = dbox_getnumeric(split_box_handle, 4);
  463.   while (keep_loop)
  464.   {
  465.     switch(dbox_fillin(split_box_handle))
  466.     {
  467.       case 5:
  468.         dbox_hide(split_box_handle);
  469.         load_choices_vals();
  470.         keep_loop = FALSE;
  471.         break;
  472.             
  473.       case 6:
  474.         split_length = dbox_getnumeric(split_box_handle, 4);
  475.         split_length = split_length - 1;
  476.         if (split_length < 2) split_length = 2;
  477.         dbox_setnumeric(split_box_handle, 4, split_length);
  478.         break;
  479.           
  480.       case 7:
  481.         split_length = dbox_getnumeric(split_box_handle, 4);
  482.         split_length = split_length + 1;
  483.         dbox_setnumeric(split_box_handle, 4, split_length);
  484.         break;
  485.       
  486.       case 11:
  487.         dbox_hide(split_box_handle);
  488.         load_choices_vals();
  489.         keep_loop = FALSE;
  490.         output_file = fopen("<Attacher$Dir>.Choices","wb");
  491.         if (output_file == NULL)
  492.         {
  493.           werr(FALSE, msgs_lookup("error4:Cannot create Choices file"));
  494.           break;
  495.         }
  496.         if (split_file) fputs("0\n", output_file);
  497.         else fputs("1\n", output_file);
  498.         split_length = dbox_getnumeric(split_box_handle, 4);
  499.         if (split_length < 2) split_length = 2;
  500.         dbox_setnumeric(split_box_handle, 4, split_length);
  501.         fprintf(output_file,"%u\n",split_length);
  502.         fprintf(output_file,"%s\n",split_prefix);
  503.         fprintf(output_file,"%s\n",split_suffix);
  504.         fprintf(output_file,"%s\n",default_file);
  505.         fprintf(output_file,"%s\n",base64_default);
  506.         if (keep_ext) fputs("0\n", output_file);
  507.         else fputs("1\n", output_file);
  508.         if (uu_add_ext) fputs("0\n", output_file);
  509.         else fputs("1\n", output_file);
  510.         if (base64_add_ext) fputs("0\n", output_file);
  511.         else fputs("1\n", output_file);
  512.         fclose(output_file);
  513.         break;      
  514.  
  515.       case 9:
  516.       default:
  517.         dbox_hide(split_box_handle);
  518.         split_file = old_split_file;
  519.         keep_ext = old_keep_ext;
  520.         uu_add_ext = old_uu_add_ext;
  521.         base64_add_ext = old_base64_add_ext;
  522.         wimp_set_icon_state(split_win_handle, 1, old_flags, 0xffffffff);
  523.         wimp_set_icon_state(split_win_handle, 24, old_flags1, 0xffffffff);
  524.         wimp_set_icon_state(split_win_handle, 28, old_flags2, 0xffffffff);
  525.         wimp_set_icon_state(split_win_handle, 29, old_flags3, 0xffffffff);
  526.         dbox_setnumeric(split_box_handle, 4, old_split_length);
  527.         split_length = dbox_getnumeric(split_box_handle, 4);
  528.         dbox_setfield(split_box_handle, 8, split_prefix);
  529.         dbox_setfield(split_box_handle, 10, split_suffix);
  530.         dbox_setfield(split_box_handle, 14, default_file);
  531.         dbox_setfield(split_box_handle, 26, base64_default);
  532.         keep_loop = FALSE;
  533.         break;
  534.     }
  535.   }
  536. }
  537.  
  538. static void check_scrap_exists()
  539. {
  540.   FILE *file_1;
  541.   
  542.   file_1 = fopen("<Wimp$ScrapDir>.Attacher", "w");
  543.   if(file_1 != NULL)
  544.   {
  545.     fclose(file_1);
  546.     remove("<Wimp$ScrapDir>.Attacher");  
  547.     strcpy(scrap_dir, "<Wimp$ScrapDir>.Attacher");
  548.     r.r[0] = 8;
  549.     r.r[1] = (int) scrap_dir;
  550.     _kernel_swi(OS_File, &r, &r);
  551.     sprintf(file_uua, "%s.!!uua!!\0", scrap_dir);
  552.     sprintf(file_uub, "%s.!!uub!!\0", scrap_dir);
  553.   }
  554. }  
  555.  
  556. static void test_for_full_scrap()
  557. {
  558.   FILE *file_1, *file_2, *file_3;
  559.   char file_full[256], file_fuller[256];
  560.   
  561.   if (unsafe_data) return;
  562.   check_scrap_exists();
  563.   
  564.   file_1 = fopen(file_uub, "w");
  565.   sprintf(file_full, "%s.!ghfddgopq\0", scrap_dir);
  566.   file_2 = fopen(file_full, "w");
  567.   sprintf(file_fuller, "%s.!ghfdskdwq\0", scrap_dir);
  568.   file_3 = fopen(file_fuller, "w");
  569.   if (file_3 == NULL)
  570.   {
  571.     fclose(file_1);
  572.     fclose(file_2);
  573.     remove(file_uub);
  574.     remove(file_fuller);
  575.     strcat(scrap_dir, ".~zq");
  576.     r.r[0] = 8;
  577.     r.r[1] = (int) scrap_dir;
  578.     _kernel_swi(OS_File, &r, &r);
  579.     sprintf(file_uua, "%s.!!uua!!\0", scrap_dir);
  580.     sprintf(file_uub, "%s.!!uub!!\0", scrap_dir);
  581.     return;
  582.   }
  583.   fclose(file_1);
  584.   fclose(file_2);
  585.   fclose(file_3);
  586.   remove(file_uub);
  587.   remove(file_full);
  588.   remove(file_fuller);
  589. }
  590.  
  591. /******************************** saving files ***************************/
  592.  
  593. static void setup_to_save(char *fname, int ftype, int indicator)
  594. {
  595.   int i, len;
  596.   char invalid_chars[20], *inv_point, *invalid_char;
  597.   
  598.   wimp_set_icon_state(action_win_handle,icon_decode,0x400000,0x400000);
  599.   wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0x400000);
  600.   wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0x400000);
  601.   len = strlen(fname) + 1;
  602.   for(i=0; i<=len; i++) if((int) fname[i] < 32) fname[i] = 0;
  603.   strcpy(invalid_chars, " &@%*#^$:,|\x5c\x22");
  604.   for (i=0; i<strlen(invalid_chars); i++)
  605.   {
  606.     inv_point = invalid_chars + 1;
  607.     invalid_char = fname - 1;
  608.     while (invalid_char != NULL)
  609.     {
  610.       invalid_char = strchr(invalid_char+1, invalid_chars[i]);
  611.       if((invalid_char != NULL)  && (*invalid_char == 44)) *invalid_char = 0;
  612.       else if (invalid_char != NULL) *invalid_char = 95;
  613.     }
  614.   }
  615.   if((indicator == 1) && split_file)
  616.   {
  617.     r.r[0] = 17;
  618.     r.r[1] = (int) file_uub;
  619.     _kernel_swi(OS_File, &r, &r);
  620.     file_length = r.r[4];
  621.     if (file_length > (split_length * 1000))
  622.     {
  623.       part_number = 0;
  624.       split_fname();
  625.       splitting_file = TRUE;
  626.     }
  627.   }
  628.   if (!splitting_file) 
  629.   {
  630.     text_in_icon(action_win_handle, icon_filename, fname);
  631.     text_in_icon(action_win_handle, icon_info, "File ready to save, double click, or drag the file icon, or click on 'Save'");
  632.   }
  633.   else text_in_icon(action_win_handle, icon_info, "First part of file ready to save, double click, or drag, or click on 'Save'");
  634.   sprintf(my_line, "R2;sfile_%03x\0", ftype);
  635.   wimp_get_icon_info(action_win_handle,icon_savefile,&result);
  636.   strcpy(result.data.indirecttext.validstring,my_line);  
  637.   wimp_set_icon_state(action_win_handle,icon_savefile,0x813f,0xffff);
  638.   wimp_set_icon_state(action_win_handle,icon_filename,0x400000,0);
  639.   wimp_set_icon_state(action_win_handle,icon_savebutton,0x400000,0);
  640.   r.r[0] = 18;
  641.   r.r[1] = (int) file_uub;
  642.   r.r[2] = ftype;
  643.   _kernel_swi(OS_File, &r, &r);
  644.   caret_pos.w = action_win_handle;
  645.   caret_pos.i = icon_filename;
  646.   caret_pos.height = -1;
  647.   wimp_get_icon_info(action_win_handle,icon_filename,&result);
  648.   caret_pos.index = strlen(result.data.indirecttext.buffer);
  649.   wimp_set_caret_pos(&caret_pos);
  650.   ok_not_grey = TRUE;
  651.   drag_filetype = ftype;
  652. }
  653.  
  654.  
  655. /****************************** Decoding files ******************************/
  656.  
  657. static void base64_decode_and_save()
  658. {
  659.   wimp_get_icon_info(split_win_handle, 24, &result);
  660.   if((result.flags & wimp_ISELECTED) == 0) r.r[0] = 2;
  661.   else r.r[0] = 3;
  662.   r.r[1] = (int) file_uua;
  663.   r.r[2] = (int) file_uub;
  664.   pos_error = _kernel_swi(TypeTrans_FromBase64, &r, &r);
  665.   remove(file_uua);
  666.   if (pos_error != NULL)
  667.   {
  668.     wimp_reporterror((os_error *) pos_error, 0, "Attacher");
  669.     wimp_get_wind_state(action_win_handle, &state);
  670.     wimp_close_wind(action_win_handle);
  671.     reset_main_window();
  672.     wimp_open_wind(&state.o);
  673.     processing_base64 = FALSE;
  674.     unsafe_data = FALSE;
  675.     return;
  676.   }
  677.   setup_to_save((char*) r.r[4], r.r[3], 0);
  678.   visdelay_end();
  679. }
  680.  
  681. static void decode64(wimp_eventstr *e)
  682. {
  683.   BOOL first_line = FALSE;
  684.   BOOL second_line = FALSE;
  685.   BOOL disposition = FALSE;
  686.   BOOL boundary = FALSE;
  687.   int i;
  688.   char buf[36];
  689.   
  690.   return_to_wimp();
  691.   strcpy(file_to_code, e->data.msg.data.dataload.name);
  692.   input_file = fopen(e->data.msg.data.dataload.name, "rb");
  693.   while (!feof(input_file) && !first_line)
  694.   {
  695.     st_result = fgets(my_line, 255, input_file);
  696.     if(st_result == NULL) break;
  697.     for( i=0;i<15;i++) buf[i] = my_line[i] | 0x20;
  698.     if(strncmp(buf, "content-type: ", 14) == 0) first_line = TRUE;   
  699.   }
  700.   if (!first_line)
  701.   {
  702.     werr(FALSE, "errore:No base64");
  703.     reset_main_window();
  704.     unsafe_data = FALSE;
  705.     processing_base64 = FALSE;
  706.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  707.     fclose(input_file);
  708.     return;
  709.   }
  710.   while (!feof(input_file) && !second_line)
  711.   {
  712.     st_result = fgets(my_line2, 255, input_file);
  713.     if(st_result == NULL) break;
  714.     for( i=0;i<34;i++) buf[i] = my_line2[i] | 0x20;
  715.     if(strncmp(buf, "content-type: ", 14) == 0)
  716.     {
  717.       for (i=0;i<255;i++) my_line[i] = my_line2[i];
  718.       disposition = FALSE;
  719.     }
  720.     if(strncmp(buf, "content-disposition: ", 21) == 0)
  721.     {
  722.       for (i=0;i<255;i++) my_line3[i] = my_line2[i];
  723.       disposition = TRUE;
  724.     }
  725.     if(strncmp(buf, "content-transfer-encoding: base64", 33) == 0) second_line = TRUE;
  726.   }
  727.   if (!second_line)
  728.   {
  729.     werr(FALSE, msgs_lookup("errore:No base64"));
  730.     reset_main_window();
  731.     unsafe_data = FALSE;
  732.     processing_base64 = FALSE;
  733.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  734.     fclose(input_file);
  735.     return;
  736.   }
  737.   text_in_icon(action_win_handle, icon_info, "Processing base64 coded file");
  738.   return_to_wimp();
  739.   if (!disposition)
  740.   {
  741.     fgetpos(input_file, &file_position);
  742.     fgets(my_line3, 100, input_file);
  743.     for( i=0;i<21;i++) buf[i] = my_line3[i] | 0x20;
  744.     if(strncmp(buf, "content-disposition: ", 21) == 0) disposition = TRUE;
  745.   }
  746.   output_file = fopen(file_uua, "wb");
  747.   fputs(my_line, output_file);
  748.   if (disposition) fputs(my_line3, output_file);
  749.   fputs(my_line2, output_file);
  750.   fgets(my_line, 255, input_file);
  751.   fputs("\n", output_file);
  752.   fsetpos(input_file, &file_position);
  753.   fgets(my_line, 255, input_file);
  754.   while (strlen(my_line) > 2) fgets(my_line, 255, input_file);
  755.   fgets(my_line, 255, input_file);
  756.   boundary = FALSE;
  757.   while ((strlen(my_line) > 2) && !feof(input_file) && !boundary)
  758.   {
  759.     fputs(my_line, output_file);
  760.     fgets(my_line, 255, input_file);
  761.     if(strncmp(my_line, "-", 1) == 0) boundary = TRUE;
  762.   }
  763.   fputs("\n", output_file);
  764.   fclose(output_file);
  765.   fgetpos(input_file, &file_position);
  766.   fclose(input_file);
  767.   return_to_wimp();
  768.   base64_decode_and_save();
  769.   return;
  770. }
  771.  
  772. static void check_for_next_base64()
  773. {
  774.   BOOL first_line = FALSE;
  775.   BOOL second_line = FALSE;
  776.   BOOL disposition = FALSE;
  777.   int i;
  778.   char buf[36];
  779.   
  780.   return_to_wimp();
  781.   input_file = fopen(file_to_code, "rb");
  782.   fsetpos(input_file, &file_position);
  783.   while (!feof(input_file) && !first_line)
  784.   {
  785.     st_result = fgets(my_line, 255, input_file);
  786.     if(st_result == NULL) break;
  787.     for( i=0;i<15;i++) buf[i] = my_line[i] | 0x20;
  788.     if(strncmp(buf, "content-type: ", 14) == 0) first_line = TRUE;   
  789.   }
  790.   if (!first_line)
  791.   {
  792.     reset_main_window();
  793.     processing_base64 = FALSE;
  794.     fclose(input_file);
  795.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  796.     visdelay_end();
  797.     return;
  798.   }
  799.   while (!feof(input_file) && !second_line)
  800.   {
  801.     st_result = fgets(my_line2, 255, input_file);
  802.     if(st_result == NULL) break;
  803.     for( i=0;i<34;i++) buf[i] = my_line2[i] | 0x20;
  804.     if(strncmp(buf, "content-type: ", 14) == 0)
  805.     {
  806.       for (i=0;i<255;i++) my_line[i] = my_line2[i];
  807.       disposition = FALSE;
  808.     }
  809.     if(strncmp(buf, "content-disposition: ", 21) == 0)
  810.     {
  811.       for (i=0;i<255;i++) my_line3[i] = my_line2[i];
  812.       disposition = TRUE;
  813.     }
  814.     if(strncmp(buf, "content-transfer-encoding: base64", 33) == 0) second_line = TRUE;
  815.   }
  816.   if (!second_line)
  817.   {
  818.     reset_main_window();
  819.     processing_base64 = FALSE;
  820.     fclose(input_file);
  821.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  822.     visdelay_end();
  823.     return;
  824.   }
  825.   unsafe_data = TRUE;
  826.   text_in_icon(action_win_handle, icon_info, "Processing base64 coded file");
  827.   if (!disposition)
  828.   {
  829.     fgetpos(input_file, &file_position);
  830.     fgets(my_line3, 100, input_file);
  831.     for( i=0;i<21;i++) buf[i] = my_line3[i] | 0x20;
  832.     if(strncmp(buf, "content-disposition: ", 21) == 0) disposition = TRUE;
  833.   }
  834.   return_to_wimp();
  835.   output_file = fopen(file_uua, "wb");
  836.   fputs(my_line, output_file);
  837.   if (disposition) fputs(my_line3, output_file);
  838.   fputs(my_line2, output_file);
  839.   fputs("\n", output_file);
  840.   fsetpos(input_file, &file_position);
  841.   fgets(my_line, 255, input_file);
  842.   while (strlen(my_line) > 2) fgets(my_line, 255, input_file);
  843.   fgets(my_line, 255, input_file);
  844.   while ((strlen(my_line) > 2) && !feof(input_file))
  845.   {
  846.     fputs(my_line, output_file);
  847.     fgets(my_line, 255, input_file);
  848.   }
  849.   fputs("\n", output_file);
  850.   fclose(output_file);
  851.   fgetpos(input_file, &file_position);
  852.   fclose(input_file);
  853.   return_to_wimp();
  854.   base64_decode_and_save();
  855.   return;
  856. }
  857.  
  858. static void decode_and_save()
  859. {
  860.   wimp_get_icon_info(split_win_handle, 24, &result);
  861.   if((result.flags & wimp_ISELECTED) == 0) r.r[0] = 2;
  862.   else r.r[0] = 3;
  863.   r.r[1] = (int) file_uua;
  864.   r.r[2] = (int) file_uub;
  865.   pos_error = _kernel_swi(TypeTrans_FromUUcode, &r, &r);
  866.   remove(file_uua);
  867.   if (pos_error != NULL)
  868.   {
  869.     wimp_reporterror((os_error *) pos_error, 0, "Attacher");
  870.     wimp_get_wind_state(action_win_handle, &state);
  871.     wimp_close_wind(action_win_handle);
  872.     reset_main_window();
  873.     wimp_open_wind(&state.o);
  874.     processing_uucode = FALSE;
  875.     unsafe_data = FALSE;
  876.     return;
  877.   }
  878.   strcpy(my_line, (char*)r.r[4]);
  879.   setup_to_save(my_line, r.r[3], 0);
  880.   visdelay_end();
  881. }
  882.  
  883. static BOOL transfer_body()
  884. {
  885.   found_end = FALSE;
  886.   while (TRUE)
  887.   {
  888.     fputs(my_line,output_file);
  889.     st_result = fgets(my_line, 255, input_file);
  890.     if (st_result == NULL) break;
  891.     if ((my_line[0] != Mchar) || (strlen(my_line) != Slen)) break;
  892.   }
  893.   if (st_result != NULL)
  894.   {
  895.     st_result = fgets(my_line2, 255, input_file);
  896.     if (st_result != NULL)
  897.     {
  898.       if (strncmp(my_line2, "end", 3) == 0)
  899.       {
  900.         fputs(my_line, output_file);
  901.         if (strncmp(my_line, "`", 1) != 0) fputs("`\n", output_file);
  902.         fputs(my_line2, output_file);
  903.         found_end = TRUE;
  904.       }
  905.       else
  906.       {
  907.         st_result = fgets(my_line3, 255, input_file);
  908.         if (st_result != NULL)
  909.         {
  910.           if (strncmp(my_line3, "end", 3) == 0)
  911.           {
  912.             fputs(my_line, output_file);
  913.             fputs(my_line2, output_file);
  914.             if (strncmp(my_line2, "`", 1) != 0) fputs("`\n", output_file);
  915.             fputs(my_line3, output_file);
  916.             found_end = TRUE;
  917.           }
  918.         }
  919.       }
  920.     }
  921.   }
  922.   fgetpos(input_file, &file_position);
  923.   if (found_end)
  924.   {
  925.     st_result = fgets(my_line, 255, input_file);
  926.     if (st_result != NULL) fputs(my_line, output_file);
  927.     text_in_icon(action_win_handle, icon_info, "Decoding complete uuencoded file");
  928.     return_to_wimp();
  929.   }
  930.   fclose(output_file);
  931.   fclose(input_file);
  932.   if (found_end) return(TRUE);
  933.   text_in_icon(action_win_handle, icon_info, "Waiting for next section of uuencoded file ...");
  934.   visdelay_end();
  935.   return(FALSE);
  936. }
  937.  
  938. static void check_for_next()
  939. {
  940.   wimp_wstate state;
  941.   
  942.   visdelay_begin();
  943.   input_file = fopen(file_to_code, "rb");
  944.   if (input_file == NULL)
  945.   {
  946.     werr(FALSE, msgs_lookup("error8: can't open source file"));
  947.     reset_main_window();
  948.     return;
  949.   }
  950.   fsetpos(input_file, &file_position);
  951.   while (!feof(input_file))
  952.   {
  953.     fgets(my_line, 255, input_file);
  954.     if(strncmp(my_line, "begin ", 6) == 0) break;
  955.   }
  956.   if (!feof(input_file))
  957.   {
  958.     text_in_icon(action_win_handle, icon_info, "Processing a further uucoded file");
  959.     return_to_wimp();
  960.     output_file = fopen(file_uua, "wb");
  961.     fputs(my_line, output_file);
  962.     st_result = fgets(my_line, 255, input_file);
  963.     if (st_result == NULL)
  964.     {
  965.       werr(FALSE, msgs_lookup("error9:Faulty file"));
  966.       fclose(input_file);
  967.       fclose(output_file);
  968.       reset_main_window();
  969.       remove(file_uua);
  970.       return;
  971.     }
  972.     Mchar = (int) my_line[0];
  973.     Slen = strlen(my_line);
  974.     unsafe_data = TRUE;
  975.     if (transfer_body()) decode_and_save();
  976.     return;
  977.   } 
  978.   fclose(input_file); 
  979.   remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  980.   wimp_get_wind_state(action_win_handle, &state);
  981.   wimp_close_wind(action_win_handle);
  982.   reset_main_window();
  983.   wimp_open_wind(&state.o);
  984.   processing_uucode = FALSE;
  985.   visdelay_end();
  986. }
  987.  
  988. static void examine_file(wimp_eventstr *e)
  989. {
  990.   int j;
  991.   char *filename;
  992.   
  993.   text_in_icon(action_win_handle, icon_info, "Processing file");
  994.   visdelay_begin();
  995.   return_to_wimp();
  996.   input_file = fopen(e->data.msg.data.dataload.name, "rb");
  997.   strcpy(file_to_code, e->data.msg.data.dataload.name);
  998.   if (input_file == NULL)
  999.   {
  1000.     werr(FALSE, msgs_lookup("error8: can't open source file"));
  1001.     reset_main_window();
  1002.     return;
  1003.   }
  1004.   while (!feof(input_file) && !processing_uucode && !processing_base64)
  1005.   {
  1006.     fgets(my_line, 255, input_file);
  1007.     for(j=0;j<34;j++) my_line2[j] = my_line[j] | 0x20;
  1008.     if(strncmp(my_line, "begin ", 6) == 0) processing_uucode = TRUE;
  1009.     if(strncmp(my_line2, "content-transfer-encoding: base64", 33) == 0) processing_base64 = TRUE;
  1010.   }
  1011.   if(!feof(input_file))
  1012.   { 
  1013.     xferrecv_checkinsert(&filename);
  1014.     xferrecv_insertfileok();
  1015.   }
  1016.   if (processing_uucode)
  1017.   {
  1018.     text_in_icon(action_win_handle, icon_info, "Processing uucoded file");
  1019.     wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1020.     wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1021.     return_to_wimp();
  1022.     output_file = fopen(file_uua, "wb");
  1023.     fputs(my_line, output_file);
  1024.     st_result = fgets(my_line, 255, input_file);
  1025.     if (st_result == NULL)
  1026.     {
  1027.       werr(FALSE, msgs_lookup("error9:Faulty file"));
  1028.       fclose(input_file);
  1029.       fclose(output_file);
  1030.       reset_main_window();
  1031.       remove(file_uua);
  1032.       return;
  1033.     }
  1034.     Mchar = (int) my_line[0];
  1035.     Slen = strlen(my_line);
  1036.     unsafe_data = TRUE;
  1037.     if (transfer_body()) decode_and_save();
  1038.     return;
  1039.   }  
  1040.   if (processing_base64)
  1041.   {
  1042.     fclose(input_file);
  1043.     unsafe_data = TRUE;
  1044.     decode64(e);
  1045.     return;
  1046.   } 
  1047.   fclose(input_file);  
  1048.   visdelay_end();
  1049.   werr(FALSE, msgs_lookup("error2:No coded data"));
  1050.   wimp_get_wind_state(action_win_handle, &state);
  1051.   wimp_close_wind(action_win_handle);
  1052.   reset_main_window();
  1053.   wimp_open_wind(&state.o);
  1054.   return;
  1055. }
  1056.  
  1057. static void next_uucode_bit(wimp_eventstr *e)
  1058. {
  1059.   text_in_icon(action_win_handle, icon_info, "Processing file");
  1060.   visdelay_begin();
  1061.   return_to_wimp();
  1062.   input_file = fopen(e->data.msg.data.dataload.name, "rb");
  1063.   strcpy(file_to_code, e->data.msg.data.dataload.name);
  1064.   if (input_file == NULL)
  1065.   {
  1066.     werr(FALSE, msgs_lookup("error8: can't open source file"));
  1067.     reset_main_window();
  1068.     return;
  1069.   }
  1070.   while (feof(input_file) == 0)
  1071.   {
  1072.     fgets(my_line, 255, input_file);
  1073.     if ((my_line[0] == Mchar) && (strlen(my_line) == Slen)) break;
  1074.   }
  1075.   text_in_icon(action_win_handle, icon_info, "Processing uucoded file");
  1076.   return_to_wimp();
  1077.   output_file = fopen(file_uua, "ab");
  1078.   if (transfer_body()) decode_and_save();
  1079.   return;  
  1080. }
  1081.  
  1082. /******************************* General Handlers ***********************/
  1083.  
  1084. static BOOL save_to_file(char *filename)
  1085. {
  1086.   BOOL success = TRUE;
  1087.   
  1088.   pos_error = NULL;
  1089.   visdelay_begin();
  1090.   text_in_icon(action_win_handle,icon_info,"Saving file");
  1091.   if (splitting_file) success = save_split_file(filename);
  1092.   else
  1093.   {
  1094.     r.r[0] = 26;
  1095.     r.r[1] = (int) file_uub;
  1096.     r.r[2] = (int) filename;
  1097.     r.r[3] = 130;
  1098.     pos_error = _kernel_swi(XOS_FSControl, &r, &r);
  1099.   }
  1100.   if(pos_error != NULL || !success) 
  1101.   {
  1102.     wimp_reporterror((os_error *) pos_error, 17, "Attacher");
  1103.     text_in_icon(action_win_handle,icon_info,"Correct the name and save the file");
  1104.     success = TRUE;
  1105.     return TRUE;
  1106.   }
  1107.   visdelay_end();
  1108.   if (splitting_file) 
  1109.   {
  1110.     split_fname();
  1111.     return TRUE;
  1112.   }
  1113.   caret_pos.w = action_win_handle;
  1114.   caret_pos.i = -1;
  1115.   wimp_set_caret_pos(&caret_pos);
  1116.   wimp_get_wind_state(action_win_handle, &state);
  1117.   wimp_close_wind(action_win_handle);
  1118.   reset_main_window();
  1119.   if (processing_uucode || processing_base64)
  1120.   {
  1121.     wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1122.     wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1123.   }
  1124.   wimp_open_wind(&state.o);
  1125.   unsafe_data = FALSE;
  1126.   return TRUE;
  1127. }
  1128.  
  1129. static void click_ok()
  1130. {
  1131.   wimp_get_icon_info(action_win_handle,icon_filename,&result);
  1132.   if (!strstr(result.data.indirecttext.buffer,"::"))
  1133.   {
  1134.     werr(FALSE,msgs_lookup("error1:To save drag the file to a directory"));
  1135.     return;
  1136.   }
  1137.   if (splitting_file) save_split_file(result.data.indirecttext.buffer);
  1138.   else save_to_file(result.data.indirecttext.buffer);
  1139. }
  1140.  
  1141. static BOOL launch_file(char *fname, int ftype, BOOL help)
  1142. {
  1143.   wimp_eventstr e;
  1144.   
  1145.   open.hdr.size = 256;
  1146.   open.hdr.your_ref = 0;
  1147.   open.hdr.action = wimp_MDATAOPEN;
  1148.   open.data.dataopen.w = action_win_handle;
  1149.   open.data.dataopen.i = 0;
  1150.   open.data.dataopen.x = 0;
  1151.   open.data.dataopen.y = 0;
  1152.   open.data.dataopen.size = 0;
  1153.   open.data.dataopen.type = ftype;
  1154.   strcpy(open.data.dataopen.name, fname);
  1155.   wimp_sendmessage(18, &open, 0);
  1156.   wimp_poll( 0x1973, &e);
  1157.   if((e.e == wimp_ESENDWANTACK) && (e.data.msg.hdr.action ==  wimp_MDATAOPEN)) wimp_poll( 0x1973, &e);
  1158.   if((e.e != wimp_ESEND) && (e.e != wimp_ESENDWANTACK) && (e.e != wimp_EACK)) return TRUE;
  1159.   if ((e.e != wimp_EACK) || (e.data.msg.hdr.action != 5)) 
  1160.   {
  1161.     unsafe_data = FALSE;
  1162.     return TRUE;
  1163.   }
  1164.   sprintf(my_line3, "Alias$@RunType_%03x\0", ftype);
  1165.   r.r[0] = (int) my_line3;
  1166.   r.r[2] = -1;
  1167.   _kernel_swi(OS_ReadVarVal, &r, &r);
  1168.   if (r.r[2] == 0)
  1169.   {
  1170.     werr(FALSE, msgs_lookup("error6:No run action"));
  1171.     if (help) return FALSE;
  1172.     r.r[0] = 25;
  1173.     r.r[1] = (int) fname;
  1174.     r.r[2] = (int) file_uub;
  1175.     _kernel_swi(OS_FSControl, &r, &r);
  1176.     return FALSE;
  1177.   }
  1178.   return_to_wimp();
  1179.   wimp_starttask(fname);
  1180.   unsafe_data = FALSE;
  1181.   visdelay_end();
  1182.   return TRUE;
  1183. }
  1184.  
  1185. static void dataload_routine (wimp_eventstr *e)
  1186. {
  1187.   char *filename;
  1188.   
  1189.   check_scrap_exists();
  1190.   if(e->data.msg.data.dataload.i == 2) /* uuencode */
  1191.   {
  1192.     visdelay_begin();
  1193.     test_for_full_scrap();
  1194.     xferrecv_checkinsert(&filename);
  1195.     xferrecv_insertfileok();
  1196.     text_in_icon(action_win_handle, icon_info, "uuencoding file");
  1197.     return_to_wimp();
  1198.     if (uu_add_ext) r.r[0] = 37;
  1199.     else r.r[0] = 36;
  1200.     r.r[1] = (int) e->data.msg.data.dataload.name;
  1201.     r.r[2] = (int) file_uub;
  1202.     r.r[3] = e->data.msg.data.dataload.type;
  1203.     r.r[4] = 0;
  1204.     pos_error = _kernel_swi(TypeTrans_ToUUcode, &r, &r);
  1205.     return_to_wimp();
  1206.     if (pos_error == NULL) setup_to_save(default_file, 0xfff, 1);
  1207.     else 
  1208.     {
  1209.       werr(FALSE , msgs_lookup("errora:cannot encode file"));
  1210.       remove(file_uub);
  1211.     }
  1212.     unsafe_data = TRUE;
  1213.     remove("<Wimp$Scrap>");
  1214.     visdelay_end();
  1215.     return;
  1216.   }
  1217.   if(e->data.msg.data.dataload.i == 1) /* uudecode */
  1218.   {
  1219.     if (processing_uucode) next_uucode_bit(e);
  1220.     test_for_full_scrap();
  1221.     if (!processing_base64 && !processing_uucode) examine_file(e);
  1222.     return;
  1223.   }
  1224.   if(e->data.msg.data.dataload.i == 3) /* base64 encode */
  1225.   {
  1226.     visdelay_begin();
  1227.     test_for_full_scrap();
  1228.     xferrecv_checkinsert(&filename);
  1229.     xferrecv_insertfileok();
  1230.     text_in_icon(action_win_handle, icon_info, "MIME base64 coding file");
  1231.     return_to_wimp();
  1232.     if (base64_add_ext) r.r[0] = 3;
  1233.     else r.r[0] = 2;
  1234.     r.r[1] = (int) e->data.msg.data.dataload.name;
  1235.     r.r[2] = (int) file_uub;
  1236.     r.r[3] = e->data.msg.data.dataload.type;
  1237.     r.r[4] = 0;
  1238.     pos_error = _kernel_swi(TypeTrans_ToBase64, &r, &r);
  1239.     return_to_wimp();
  1240.     if (pos_error == NULL) setup_to_save(base64_default, 0xfff, 2);
  1241.     else 
  1242.     {
  1243.       werr(FALSE , msgs_lookup("errorc:cannot base64 code file"));
  1244.       remove(file_uub);
  1245.     }
  1246.     unsafe_data = TRUE;
  1247.     remove("<Wimp$Scrap>");
  1248.     visdelay_end();
  1249.     return;
  1250.   }
  1251. }
  1252.  
  1253. /******************************WINDOW EVENTS ******************************/
  1254. static void action_event_handler(wimp_eventstr *e, void *handle)
  1255. {
  1256.   wimp_t sender;
  1257.   wimp_mousestr mouse_inf;
  1258.   char *last_pointer, *leaf_name, *point, *task_name;
  1259.   
  1260.   handle=handle;
  1261.   if(help_process(e)) return;
  1262.  
  1263.   switch(e->e)
  1264.   {
  1265.     case wimp_ENULL:
  1266.       wimp_get_point_info(&mouse_inf);
  1267.       if (mouse_inf.w != action_win_handle) break;
  1268.       switch (mouse_inf.i)
  1269.       {
  1270.         case icon_decode:
  1271.           if (icon_decode != help_icon)
  1272.           {
  1273.             text_in_icon(action_win_handle, icon_help, "Decode uucode/base64");
  1274.             help_icon = icon_decode;
  1275.           }
  1276.           break;
  1277.           
  1278.         case icon_uuencode:
  1279.           if (icon_uuencode != help_icon)
  1280.           {
  1281.             text_in_icon(action_win_handle, icon_help, "UUencode file");
  1282.             help_icon = icon_uuencode;
  1283.           }
  1284.           break;
  1285.           
  1286.         case icon_64encode:
  1287.           if (icon_64encode != help_icon)
  1288.           {
  1289.             text_in_icon(action_win_handle, icon_help, "base64 code file");
  1290.             help_icon = icon_64encode;
  1291.           }
  1292.           break;
  1293.           
  1294.         default:
  1295.           if (help_icon != -1)
  1296.           {
  1297.             text_in_icon(action_win_handle, icon_help, "");
  1298.             help_icon = -1;
  1299.           }
  1300.           break;
  1301.       }
  1302.       break;
  1303.       
  1304.     case wimp_EOPEN:
  1305.       wimp_open_wind(&e->data.o);
  1306.       break;
  1307.       
  1308.     case wimp_ECLOSE:
  1309.       if (unsafe_data && !(dboxquery("Closing the window will lose unsaved data, do you really want to discard this data?")==1)) break;
  1310.       wimp_close_wind(e->data.o.w);
  1311.       wimp_set_icon_state(split_win_handle,11,0,wimp_INOSELECT);
  1312.       wimp_set_icon_state(split_win_handle,5,0,wimp_INOSELECT);
  1313.       my_win_open = FALSE;
  1314.       unsafe_data = FALSE;
  1315.       splitting_file = FALSE;
  1316.       already_found_a_file = FALSE;
  1317.       processing_uucode = FALSE;
  1318.       processing_base64 = FALSE;
  1319.       remove(file_uua);
  1320.       remove(file_uub);
  1321.       break; 
  1322.       
  1323.     case wimp_EPTRLEAVE:
  1324.       event_setmask(1);
  1325.       text_in_icon(action_win_handle, icon_help, "");
  1326.       help_icon = -1;
  1327.       break;
  1328.       
  1329.     case wimp_EPTRENTER:
  1330.       event_setmask(0);
  1331.       break; 
  1332.  
  1333.     case wimp_EKEY:
  1334.       if(e->data.key.chcode == 13 && ok_not_grey)
  1335.       {
  1336.         click_ok();
  1337.         break;
  1338.       }
  1339.       else wimp_processkey(e->data.key.chcode);
  1340.       break;
  1341.       
  1342.     case wimp_EBUT:
  1343.       if(e->data.but.m.i == icon_cancel)
  1344.       {
  1345.         wimp_get_wind_state(action_win_handle, &state);
  1346.         if (unsafe_data) wimp_close_wind(action_win_handle);
  1347.         reset_main_window();
  1348.         if (unsafe_data) wimp_open_wind(&state.o);
  1349.         caret_pos.w = action_win_handle;
  1350.         caret_pos.i = -1;
  1351.         wimp_set_caret_pos(&caret_pos);
  1352.         unsafe_data = FALSE;
  1353.         processing_uucode = FALSE;
  1354.         processing_base64 = FALSE;
  1355.         remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!");
  1356.         remove(file_uua);
  1357.         remove(file_uub);
  1358.         break;
  1359.       }
  1360.       if(e->data.but.m.i == icon_discard)
  1361.       {
  1362.         if(unsafe_data == FALSE) break;
  1363.         caret_pos.w = action_win_handle;
  1364.         caret_pos.i = -1;
  1365.         wimp_set_caret_pos(&caret_pos);
  1366.         wimp_get_wind_state(action_win_handle, &state);
  1367.         wimp_close_wind(action_win_handle);
  1368.         reset_main_window();
  1369.         if (processing_uucode || processing_base64)
  1370.         {
  1371.           wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1372.           wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1373.         }
  1374.         wimp_open_wind(&state.o);
  1375.         remove(file_uua);
  1376.         remove(file_uub);
  1377.         unsafe_data = FALSE;        
  1378.         if(processing_uucode) check_for_next();
  1379.         if(processing_base64) check_for_next_base64();
  1380.         break;
  1381.       }
  1382.       if(e->data.but.m.i == icon_savebutton)
  1383.       {
  1384.         click_ok();
  1385.         break;
  1386.       }
  1387.       if((e->data.but.m.i == icon_savefile) && (e->data.but.m.bbits == wimp_BDRAGLEFT)  && ok_not_grey)
  1388.       {
  1389.         wimp_set_icon_state(action_win_handle, icon_savefile, 0, wimp_ISELECTED);
  1390.         start_the_drag();
  1391.         break;
  1392.       }
  1393.       
  1394.       if((e->data.but.m.i == icon_savefile) && (e->data.but.m.bbits == wimp_BLEFT))
  1395.       {
  1396.         if(splitting_file) break;
  1397.         wimp_set_icon_state(action_win_handle, icon_savefile, 0, wimp_ISELECTED);
  1398.         wimp_get_icon_info(action_win_handle, icon_filename, &result);
  1399.         sprintf(my_line, ".%s\0", result.data.indirecttext.buffer);
  1400.         last_pointer = my_line;
  1401.         while (last_pointer != NULL)
  1402.         {
  1403.           leaf_name = last_pointer + 1;
  1404.           last_pointer = strchr(last_pointer + 1, 46);
  1405.         }
  1406.         sprintf(my_line2, "%s.%s\0", scrap_dir, leaf_name);
  1407.         remove(my_line2);
  1408.         rename(file_uub, my_line2);
  1409.         remove("<Wimp$Scrap>");
  1410.         if(launch_file(my_line2, drag_filetype, FALSE))
  1411.         {
  1412.           reset_main_window();
  1413.           caret_pos.w = action_win_handle;
  1414.           caret_pos.i = -1;
  1415.           wimp_set_caret_pos(&caret_pos);
  1416.           wimp_get_wind_state(action_win_handle, &state);
  1417.           wimp_close_wind(action_win_handle);
  1418.           reset_main_window();
  1419.           if (processing_uucode || processing_base64)
  1420.           {
  1421.             wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1422.             wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1423.           }
  1424.           else unsafe_data = FALSE;
  1425.           wimp_open_wind(&state.o);
  1426.           if (processing_uucode) check_for_next();
  1427.           if (processing_base64) check_for_next_base64();
  1428.         }
  1429.         visdelay_end();
  1430.         break;
  1431.       }
  1432.       break;
  1433.       
  1434.     case wimp_EUSERDRAG:
  1435.       wimp_get_point_info(&mouse_inf);
  1436.       if(mouse_inf.w == action_win_handle) break;
  1437.       if((mouse_inf.w == -2) && (mouse_inf.i == my_ibar_icon)) break;
  1438.       msg.hdr.size = 256;
  1439.       msg.hdr.task = mouse_inf.w;
  1440.       msg.hdr.your_ref = 0;
  1441.       msg.hdr.action = wimp_MDATASAVE;
  1442.       msg.data.datasave.w = mouse_inf.w;
  1443.       msg.data.datasave.i = mouse_inf.i;
  1444.       msg.data.datasave.x = mouse_inf.x;
  1445.       msg.data.datasave.y = mouse_inf.y;
  1446.       msg.data.datasave.type = drag_filetype;
  1447.       msg.data.datasave.estsize = 0;
  1448.       {
  1449.         int i, tail;
  1450.         char name[256];
  1451.         wimp_get_icon_info(action_win_handle, icon_filename, &result);
  1452.         strncpy(name, result.data.indirecttext.buffer, 256);
  1453.         for(i = 0; i <=256; i++) if ((int) name[i] < 32) name[i] = '\0'; 
  1454.         tail = strlen(name);
  1455.         while ((tail > 0) && (name[tail-1] != '.') && (name[tail-1] != ':')) tail--;
  1456.         for (i = 0; i <= 200; i++) msg.data.datasave.leaf[i] = name[tail++];
  1457.         msg.data.datasave.leaf[200] = '\0'; 
  1458.       }
  1459.       wimpt_noerr(wimp_sendwmessage(wimp_ESEND, &msg, mouse_inf.w, mouse_inf.i));
  1460.       break;
  1461.       
  1462.     case wimp_ESEND:
  1463.     case wimp_ESENDWANTACK:
  1464.       if(e->data.msg.hdr.action == wimp_MPREQUIT)
  1465.       {
  1466.         prequit = TRUE;
  1467.         if (unsafe_data)
  1468.         {
  1469.           e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  1470.           sender = e->data.msg.hdr.task;
  1471.           wimp_sendmessage(wimp_EACK, &e->data.msg, sender);
  1472.           if (!(dboxquery("Attacher has unsaved data, do you really want to quit the desktop and discard this data?")==1)) break; 
  1473.           else 
  1474.           {
  1475.             unsafe_data = FALSE;
  1476.             open.data.words[1] = 0x1fc;
  1477.             wimp_sendmessage(8, &open, sender);
  1478.           }
  1479.         }
  1480.         break;
  1481.       }
  1482.       if(e->data.msg.hdr.action == wimp_MINITTASK)
  1483.       {
  1484.         if(e->data.msg.hdr.task != wimpt_task())
  1485.         {
  1486.           task_name = e->data.msg.data.chars + 8;
  1487.           point = strstr(task_name, "Attacher");
  1488.           if ((point != NULL))
  1489.           {
  1490.             werr(FALSE, msgs_lookup("error0:Already running"));
  1491.             msg.hdr.size = 256;
  1492.             msg.hdr.your_ref = 0;
  1493.             msg.hdr.action = wimp_MCLOSEDOWN;
  1494.             wimp_sendmessage(wimp_ESEND, &msg, e->data.msg.hdr.task);
  1495.           }
  1496.         }
  1497.       }
  1498.       if(e->data.msg.hdr.action == wimp_MHELPREQUEST)
  1499.       {
  1500.         process_help_message(e);
  1501.         break;
  1502.       }
  1503.       if(e->data.msg.hdr.action == wimp_MDATASAVE)
  1504.       {
  1505.         if((e->data.msg.data.datasave.i < 1) || (e->data.msg.data.datasave.i > 3)) break;
  1506.         if(e->data.msg.data.datasave.type > 0xfff) break;
  1507.         if(e->data.msg.hdr.task == wimpt_task()) break;
  1508.         check_scrap_exists();
  1509.         reply_with_scrap(e);
  1510.         break;
  1511.       }
  1512.       if(e->data.msg.hdr.action == wimp_MDATALOAD)
  1513.       {
  1514.         if (ok_not_grey) break;
  1515.         if((e->data.msg.data.datasave.i < 1) || (e->data.msg.data.datasave.i > 3)) break;
  1516.         if(e->data.msg.data.dataload.type > 0xfff)
  1517.         { 
  1518.           input_file = fopen(e->data.msg.data.dataload.name, "rb");
  1519.           if (fgetc(input_file) == EOF)
  1520.           {
  1521.             werr(FALSE, msgs_lookup("error3:Cannot code or decode"));
  1522.             fclose(input_file);
  1523.             break;
  1524.           }
  1525.           else fclose(input_file);
  1526.         }
  1527.         if (!splitting_file) dataload_routine(e);
  1528.         break;
  1529.       }  
  1530.       if(e->data.msg.hdr.action == wimp_MDATASAVEOK)
  1531.       {
  1532.         if (splitting_file) save_split_file(e->data.msg.data.datasaveok.name);
  1533.         else save_to_file(e->data.msg.data.datasaveok.name);
  1534.         e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  1535.         e->data.msg.hdr.action = wimp_MDATALOAD;
  1536.         e->data.msg.data.dataload.type = drag_filetype;
  1537.         wimpt_noerr(wimp_sendmessage(wimp_ESENDWANTACK, &e->data.msg,e->data.msg.hdr.task));
  1538.         if(processing_uucode) check_for_next();
  1539.         if(processing_base64) check_for_next_base64();
  1540.         break;
  1541.       }    
  1542.  
  1543.     default:
  1544.       break;
  1545.   }
  1546. }
  1547.  
  1548. /********************************* MENU EVENTS ****************************/
  1549. static void my_menuproc(void *handle, char *hit)
  1550. {
  1551.   handle=handle;
  1552.  
  1553.   switch (hit[0])
  1554.   {
  1555.     case 1:
  1556.       dbox_show(info_box_handle);
  1557.       dbox_fillin(info_box_handle);
  1558.       dbox_hide(info_box_handle);
  1559.       break;
  1560.       
  1561.     case 2:
  1562.       handle_uu_choices();
  1563.       break;
  1564.       
  1565.     case 3:
  1566.       handle_link();
  1567.       break;
  1568.       
  1569.     case 4:
  1570.       os_read_var_val("Wimp$ScrapDir", my_line, 255);
  1571.       sprintf(my_line2, "Filer_OpenDir %s.Attacher", my_line);
  1572.       os_cli(my_line2);
  1573.       break;
  1574.             
  1575.     case 5:
  1576.       launch_file("<Attacher$Help>", 0xfff, TRUE);
  1577.       break;
  1578.       
  1579.     case 6:
  1580.       if (unsafe_data && !(dboxquery("Quitting will lose unsaved data, do you really want to discard this data?")==1)) break;
  1581.       prequit = TRUE;
  1582.       exit(0);
  1583.    }
  1584. }
  1585. /****************************** INITIALISATION ****************************/
  1586.  
  1587. static void initialise(void)
  1588.   int st_result1;
  1589.   
  1590.   wimpt_wimpversion(310);
  1591.   wimpt_init("Attacher");
  1592.   res_init("Attacher");
  1593.   resspr_init();
  1594.   template_init();
  1595.   msgs_init();
  1596.   dbox_init();
  1597.   atexit(&exit_function);
  1598.  
  1599.   my_menu = menu_new("Attacher", ">Info,>Choices,>Links,Open Dir,Help,Quit");
  1600.   
  1601.   my_ibar_icon = baricon("!attacher", (int)resspr_area(), my_iconclick);
  1602.   event_attachmenu(win_ICONBAR, my_menu, my_menuproc, 0);
  1603.   
  1604.   wimp_create_wind(template_syshandle ("Action"),&action_win_handle);
  1605.   win_register_event_handler(action_win_handle, action_event_handler, 0);
  1606.   event_attachmenu(action_win_handle, my_menu, my_menuproc, 0);
  1607.   win_claim_unknown_events(action_win_handle);
  1608.   win_claim_idle_events(action_win_handle);
  1609.   open_main_window();
  1610.   
  1611.   info_box_handle=dbox_new("Info");
  1612.   dbox_setfield(info_box_handle,3,"© John Allen 1997");
  1613.   dbox_setfield(info_box_handle,4,"1.01 (13-Nov-1997)");
  1614.   strcpy(version_num, "1.01");
  1615.   dbox_raw_eventhandler(info_box_handle, help_dboxrawevents, "Info");
  1616.   links_box_handle = dbox_new("Links");
  1617.   dbox_raw_eventhandler(links_box_handle, help_dboxrawevents, "Links");
  1618.   
  1619.   split_box_handle=dbox_new("Split");
  1620.   split_length = 60;
  1621.   dbox_setnumeric(split_box_handle, 4, split_length);
  1622.   strcpy(split_prefix, "Part");
  1623.   strcpy(split_suffix, "/uue");
  1624.   strcpy(default_file, "uuencoded");
  1625.   strcpy(base64_default, "base64");
  1626.   dbox_setfield(split_box_handle, 8, split_prefix);
  1627.   dbox_setfield(split_box_handle, 10, split_suffix);
  1628.   dbox_setfield(split_box_handle, 14, default_file);
  1629.   dbox_setfield(split_box_handle, 26, base64_default);
  1630.   dbox_raw_eventhandler(split_box_handle, help_dboxrawevents, "Split");
  1631.   split_win_handle = dbox_syshandle(split_box_handle);
  1632.   wimp_set_icon_state(split_win_handle, 1, 0, wimp_ISELECTED);
  1633.   
  1634.   input_file = fopen("<Attacher$Dir>.Choices","rb");
  1635.   if (input_file != NULL)
  1636.   {
  1637.     st_result = fgets(my_line, 2, input_file);
  1638.     if (st_result != NULL)
  1639.     {
  1640.       if (strncmp(my_line,"0",1) == 0)
  1641.       {
  1642.         split_file = TRUE;
  1643.         wimp_set_icon_state(split_win_handle, 1, wimp_ISELECTED, wimp_ISELECTED);
  1644.       }
  1645.       st_result1 = fscanf(input_file, "%d\n", &split_length);
  1646.       if (st_result1 != EOF) dbox_setnumeric(split_box_handle, 4, split_length);
  1647.       st_result = fgets(split_prefix, 255, input_file);
  1648.       if (st_result != NULL) dbox_setfield(split_box_handle, 8, split_prefix);
  1649.       st_result = fgets(split_suffix, 10, input_file);
  1650.       if (st_result != NULL) dbox_setfield(split_box_handle, 10, split_suffix);
  1651.       st_result = fgets(default_file, 255, input_file);
  1652.       if (st_result != NULL) dbox_setfield(split_box_handle, 14, default_file);
  1653.       st_result = fgets(base64_default, 255, input_file);
  1654.       if (st_result != NULL) dbox_setfield(split_box_handle, 26, base64_default);
  1655.       st_result = fgets(my_line, 255, input_file);
  1656.       if (st_result != NULL)
  1657.       {
  1658.         if (strncmp(my_line,"0",1) == 0)
  1659.         {
  1660.           keep_ext = TRUE;
  1661.           wimp_set_icon_state(split_win_handle, 24, wimp_ISELECTED, wimp_ISELECTED); 
  1662.         }
  1663.       }
  1664.       st_result = fgets(my_line, 255, input_file);
  1665.       if (st_result != NULL)
  1666.       {
  1667.         if (strncmp(my_line,"0",1) == 0)
  1668.         {
  1669.           uu_add_ext = TRUE;
  1670.           wimp_set_icon_state(split_win_handle, 28, wimp_ISELECTED, wimp_ISELECTED); 
  1671.         }
  1672.       }
  1673.       st_result = fgets(my_line, 255, input_file);
  1674.       if (st_result != NULL)
  1675.       {
  1676.         if (strncmp(my_line,"0",1) == 0)
  1677.         {
  1678.           base64_add_ext = TRUE;
  1679.           wimp_set_icon_state(split_win_handle, 29, wimp_ISELECTED, wimp_ISELECTED); 
  1680.         }
  1681.       }
  1682.       load_choices_vals();
  1683.     }
  1684.   }
  1685.   fclose(input_file);
  1686.   
  1687.   os_read_var_val("Wimp$ScrapDir", my_line, 255);
  1688.   if(strlen(my_line) == 0) werr(TRUE, msgs_lookup("error5:No Wimp$ScrapDir"));
  1689.   
  1690.   help_register_handler(help_simplehandler, "Menu");
  1691.   
  1692.   strcpy(scrap_dir, "<Wimp$ScrapDir>.Attacher");
  1693.   r.r[0] = 8;
  1694.   r.r[1] = (int) scrap_dir;
  1695.   _kernel_swi(OS_File, &r, &r);
  1696.   strcpy(file_uua, scrap_dir);
  1697.   strcat(file_uua, ".!!uua!!");
  1698.   strcpy(file_uub, scrap_dir);
  1699.   strcat(file_uub, ".!!uub!!");
  1700.   
  1701.   help_icon = -1;
  1702. }
  1703. /******************************* MAIN PROGRAM *****************************/
  1704.  
  1705. int main()
  1706. {
  1707.   initialise();
  1708.   {
  1709.     while (TRUE)
  1710.       event_process();
  1711.   }
  1712.  
  1713.   return 0;
  1714. }
  1715.